package ioc07;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/3/4 15:59
 * Version:1.0-SNAPSHOT
 */
public class Test {

    public static void main(String[] args) {
//        SomeBean someBean = new SomeBean();

        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("ioc07/spring.xml");
        SomeBean someBean = (SomeBean) ac.getBean("someBean");

//        System.gc();
//        Runtime.getRuntime().gc();
        // Spring中提供的销毁方法是强制执行的
        // 手动销毁
        // 共有两种方式,这两种方式均是实现类ClassPathXmlApplicationContext提供的
        // 方式一:destory方法,该方法表示手动销毁
        // 表示当方法执行到此处时立刻销毁Spring容器中的bean
        // 不关心后面是否仍然需要对bean进行调用
        // 当销毁之后,如果再次调用则直接报错
//        ac.destroy();
        // 方式二:registerShutdownHook,该方法也表示手动销毁
        // 表示的当方法执行到此处时做一个销毁标记
        // 此时并没有进行销毁
        // 当所有代码运行完成,JVM停止之后会搜索是否存在销毁标记
        // 如果存在销毁标记,这时候Spring会进行销毁
        ac.registerShutdownHook();
        // 如果Spring容器已经被销毁
        // 则执行下面代码会报错
//        SomeBean someBean2 = (SomeBean) ac.getBean("someBean");
        // 如果JVM并没有停止,则registerShutdownHook方法不会执行销毁操作
        while (true){

        }
    }

}
